#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
DeepSeek AI服务模块
提供智能数据分析和问答功能
"""

from typing import List, Dict, Any, Optional
from PyQt5.QtCore import QThread, pyqtSignal

try:
    from openai import OpenAI
    OPENAI_AVAILABLE = True
except ImportError:
    OPENAI_AVAILABLE = False


class DeepSeekService:
    """DeepSeek AI服务类"""

    def __init__(self, api_key: str):
        self.api_key = api_key

        if not OPENAI_AVAILABLE:
            raise ImportError("请安装openai库：pip install openai>=1.0.0")

        # 使用OpenAI兼容的客户端
        self.client = OpenAI(
            api_key=api_key,
            base_url="https://api.deepseek.com"
        )
    
    def analyze_car_data(self, cars_data: List[Dict], question: str = None) -> str:
        """
        分析汽车数据并生成智能报告
        
        Args:
            cars_data: 汽车数据列表
            question: 用户问题（可选）
        
        Returns:
            AI分析结果
        """
        if not cars_data:
            return "❌ 没有数据可供分析"
        
        # 准备数据摘要
        data_summary = self._prepare_data_summary(cars_data)
        
        # 构建提示词
        if question:
            prompt = f"""
作为汽车行业专家，请基于以下汽车数据回答用户问题。

汽车数据摘要：
{data_summary}

用户问题：{question}

请提供专业、详细的分析和建议。使用中文回答，并使用适当的emoji图标。
"""
        else:
            prompt = f"""
作为汽车行业专家，请分析以下汽车数据并生成智能报告。

汽车数据摘要：
{data_summary}

请从以下角度进行分析：
1. 🏆 市场排名趋势分析
2. 💰 价格区间分布特点
3. ⭐ 用户评分情况
4. 📈 销量表现分析
5. 🎯 购车建议

请使用中文，语言专业且易懂，适当使用emoji图标。
"""
        
        return self._call_api(prompt)
    
    def get_car_recommendation(self, budget: str, preferences: str, cars_data: List[Dict]) -> str:
        """
        基于预算和偏好推荐汽车
        
        Args:
            budget: 预算范围
            preferences: 用户偏好
            cars_data: 汽车数据
        
        Returns:
            推荐结果
        """
        data_summary = self._prepare_data_summary(cars_data)
        
        prompt = f"""
作为汽车购买顾问，请基于用户需求推荐合适的汽车。

用户预算：{budget}
用户偏好：{preferences}

可选汽车数据：
{data_summary}

请提供：
1. 🎯 最佳推荐车型（3-5款）
2. 💡 推荐理由
3. ⚠️ 注意事项
4. 💰 性价比分析

请使用中文，语言亲切专业。
"""
        
        return self._call_api(prompt)
    
    def compare_cars(self, car_names: List[str], cars_data: List[Dict]) -> str:
        """
        对比指定汽车
        
        Args:
            car_names: 要对比的汽车名称列表
            cars_data: 汽车数据
        
        Returns:
            对比分析结果
        """
        # 筛选指定汽车的数据
        selected_cars = []
        for car in cars_data:
            car_name = car.get('name', '') if isinstance(car, dict) else getattr(car, 'name', '')
            if any(name.lower() in car_name.lower() for name in car_names):
                selected_cars.append(car)
        
        if not selected_cars:
            return "❌ 未找到指定的汽车数据"
        
        comparison_data = self._prepare_comparison_data(selected_cars)
        
        prompt = f"""
作为汽车评测专家，请对比分析以下汽车：

对比车型数据：
{comparison_data}

请提供详细对比分析：
1. 🏆 排名对比
2. 💰 价格对比
3. ⭐ 评分对比
4. 📈 销量对比
5. 🎯 优缺点分析
6. 💡 选择建议

请使用中文，客观专业地分析。
"""
        
        return self._call_api(prompt)
    
    def _prepare_data_summary(self, cars_data: List[Dict]) -> str:
        """准备数据摘要"""
        if not cars_data:
            return "无数据"
        
        summary_lines = []
        summary_lines.append(f"数据总数：{len(cars_data)}款汽车")
        
        # 取前10款作为示例
        for i, car in enumerate(cars_data[:10]):
            if isinstance(car, dict):
                name = car.get('name', '未知')
                rank = car.get('rank', 0)
                score = car.get('score', 0)
                price = car.get('price', '暂无报价')
                sales = car.get('sales', 0)
            else:
                name = getattr(car, 'name', '未知')
                rank = getattr(car, 'rank', 0)
                score = getattr(car, 'score', 0)
                price = getattr(car, 'price', '暂无报价')
                sales = getattr(car, 'sales', 0)
            
            summary_lines.append(f"{i+1}. {name} - 排名:{rank} 评分:{score} 价格:{price} 销量:{sales}")
        
        if len(cars_data) > 10:
            summary_lines.append(f"... 还有{len(cars_data) - 10}款汽车")
        
        return "\n".join(summary_lines)
    
    def _prepare_comparison_data(self, cars_data: List[Dict]) -> str:
        """准备对比数据"""
        comparison_lines = []
        
        for car in cars_data:
            if isinstance(car, dict):
                name = car.get('name', '未知')
                rank = car.get('rank', 0)
                score = car.get('score', 0)
                price = car.get('price', '暂无报价')
                sales = car.get('sales', 0)
            else:
                name = getattr(car, 'name', '未知')
                rank = getattr(car, 'rank', 0)
                score = getattr(car, 'score', 0)
                price = getattr(car, 'price', '暂无报价')
                sales = getattr(car, 'sales', 0)
            
            comparison_lines.append(f"""
车型：{name}
排名：{rank}
评分：{score}
价格：{price}
销量：{sales}
""")
        
        return "\n".join(comparison_lines)
    
    def _call_api(self, prompt: str) -> str:
        """调用DeepSeek API"""
        try:
            response = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=[
                    {"role": "system", "content": "你是一位专业的汽车行业专家和购车顾问，具有丰富的汽车市场知识和数据分析能力。"},
                    {"role": "user", "content": prompt}
                ],
                max_tokens=2000,
                temperature=0.7,
                stream=False
            )

            return response.choices[0].message.content

        except Exception as e:
            error_msg = str(e)
            if "timeout" in error_msg.lower():
                return "❌ 请求超时，请检查网络连接"
            elif "api" in error_msg.lower():
                return f"❌ API调用失败：{error_msg}"
            elif "auth" in error_msg.lower():
                return "❌ API密钥验证失败，请检查密钥是否正确"
            else:
                return f"❌ 未知错误：{error_msg}"


class AIAnalysisThread(QThread):
    """AI分析线程"""
    
    analysis_completed = pyqtSignal(str)
    error_occurred = pyqtSignal(str)
    
    def __init__(self, deepseek_service: DeepSeekService, analysis_type: str, **kwargs):
        super().__init__()
        self.deepseek_service = deepseek_service
        self.analysis_type = analysis_type
        self.kwargs = kwargs
    
    def run(self):
        """执行AI分析"""
        try:
            if self.analysis_type == "analyze":
                result = self.deepseek_service.analyze_car_data(
                    self.kwargs.get('cars_data', []),
                    self.kwargs.get('question')
                )
            elif self.analysis_type == "recommend":
                result = self.deepseek_service.get_car_recommendation(
                    self.kwargs.get('budget', ''),
                    self.kwargs.get('preferences', ''),
                    self.kwargs.get('cars_data', [])
                )
            elif self.analysis_type == "compare":
                result = self.deepseek_service.compare_cars(
                    self.kwargs.get('car_names', []),
                    self.kwargs.get('cars_data', [])
                )
            else:
                result = "❌ 未知的分析类型"
            
            self.analysis_completed.emit(result)
            
        except Exception as e:
            self.error_occurred.emit(f"AI分析出错：{str(e)}")
